package menu

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/logger"
	"sg-backend/model/user"
	"sg-backend/utils"
)

/*
 * 4
 * DELETE,删除菜单请求，/api/user/menu
 */

type deleteKey struct {
	Key uint `json:"key"`
}

func DeleteMenu(ctx *fiber.Ctx) error {
	// 权限验证
	utils.CheckPermsByTag("UserMenu", global.AuthUser.UserId, "delete")

	var delForm deleteKey
	if err := ctx.BodyParser(&delForm); err != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("数据解释出错！%s", err),
		})
	}

	// 获取删除的菜单信息
	menuObj := user.Menu{Id: delForm.Key}
	r := global.DB.First(&menuObj)
	if r.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("传参错误！错误：%v", r.Error),
		})
	}

	// 判定是否有下级菜单，如果有下级菜单，则不允许删除
	var menuModel []user.Menu
	hasSubMenu := global.DB.Where("pid = ?", menuObj.Id).Find(&menuModel)
	if hasSubMenu.RowsAffected != 0 {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "此菜单仍有下级菜单，不允许删除！",
		})
	}

	// 记录删除信息
	delInfo := MenusJson{
		Id: menuObj.Id, Pid: menuObj.Pid, Title: menuObj.Title, Url: menuObj.Url, PrivilegeName: menuObj.PrivilegeName,
		OrderNum: menuObj.OrderNum,
	}

	// 执行删除
	d := global.DB.Delete(&menuObj)
	if d.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("删除失败！错误：%v", r.Error),
		})
	}

	// 记录日志
	logger.DbInfo(global.AuthUser.Username, fmt.Sprintf("删除菜单成功！菜单：%+v ", delInfo))
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "删除成功！",
	})
}
